home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / include / linux / phonet.h < prev    next >
C/C++ Source or Header  |  2009-10-16  |  4KB  |  174 lines

  1. /**
  2.  * file phonet.h
  3.  *
  4.  * Phonet sockets kernel interface
  5.  *
  6.  * Copyright (C) 2008 Nokia Corporation. All rights reserved.
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * version 2 as published by the Free Software Foundation.
  11.  *
  12.  * This program is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20.  * 02110-1301 USA
  21.  */
  22.  
  23. #ifndef LINUX_PHONET_H
  24. #define LINUX_PHONET_H
  25.  
  26. #include <linux/types.h>
  27.  
  28. /* Automatic protocol selection */
  29. #define PN_PROTO_TRANSPORT    0
  30. /* Phonet datagram socket */
  31. #define PN_PROTO_PHONET        1
  32. /* Phonet pipe */
  33. #define PN_PROTO_PIPE        2
  34. #define PHONET_NPROTO        3
  35.  
  36. /* Socket options for SOL_PNPIPE level */
  37. #define PNPIPE_ENCAP        1
  38. #define PNPIPE_IFINDEX        2
  39.  
  40. #define PNADDR_ANY        0
  41. #define PNPORT_RESOURCE_ROUTING    0
  42.  
  43. /* Values for PNPIPE_ENCAP option */
  44. #define PNPIPE_ENCAP_NONE    0
  45. #define PNPIPE_ENCAP_IP        1
  46.  
  47. /* ioctls */
  48. #define SIOCPNGETOBJECT        (SIOCPROTOPRIVATE + 0)
  49.  
  50. /* Phonet protocol header */
  51. struct phonethdr {
  52.     __u8    pn_rdev;
  53.     __u8    pn_sdev;
  54.     __u8    pn_res;
  55.     __be16    pn_length;
  56.     __u8    pn_robj;
  57.     __u8    pn_sobj;
  58. } __attribute__((packed));
  59.  
  60. /* Common Phonet payload header */
  61. struct phonetmsg {
  62.     __u8    pn_trans_id;    /* transaction ID */
  63.     __u8    pn_msg_id;    /* message type */
  64.     union {
  65.         struct {
  66.             __u8    pn_submsg_id;    /* message subtype */
  67.             __u8    pn_data[5];
  68.         } base;
  69.         struct {
  70.             __u16    pn_e_res_id;    /* extended resource ID */
  71.             __u8    pn_e_submsg_id;    /* message subtype */
  72.             __u8    pn_e_data[3];
  73.         } ext;
  74.     } pn_msg_u;
  75. };
  76. #define PN_COMMON_MESSAGE    0xF0
  77. #define PN_COMMGR        0x10
  78. #define PN_PREFIX        0xE0 /* resource for extended messages */
  79. #define pn_submsg_id        pn_msg_u.base.pn_submsg_id
  80. #define pn_e_submsg_id        pn_msg_u.ext.pn_e_submsg_id
  81. #define pn_e_res_id        pn_msg_u.ext.pn_e_res_id
  82. #define pn_data            pn_msg_u.base.pn_data
  83. #define pn_e_data        pn_msg_u.ext.pn_e_data
  84.  
  85. /* data for unreachable errors */
  86. #define PN_COMM_SERVICE_NOT_IDENTIFIED_RESP    0x01
  87. #define PN_COMM_ISA_ENTITY_NOT_REACHABLE_RESP    0x14
  88. #define pn_orig_msg_id        pn_data[0]
  89. #define pn_status        pn_data[1]
  90. #define pn_e_orig_msg_id    pn_e_data[0]
  91. #define pn_e_status        pn_e_data[1]
  92.  
  93. /* Phonet socket address structure */
  94. struct sockaddr_pn {
  95.     sa_family_t spn_family;
  96.     __u8 spn_obj;
  97.     __u8 spn_dev;
  98.     __u8 spn_resource;
  99.     __u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - 3];
  100. } __attribute__ ((packed));
  101.  
  102. static __inline__ __u16 pn_object(__u8 addr, __u16 port)
  103. {
  104.     return (addr << 8) | (port & 0x3ff);
  105. }
  106.  
  107. static __inline__ __u8 pn_obj(__u16 handle)
  108. {
  109.     return handle & 0xff;
  110. }
  111.  
  112. static __inline__ __u8 pn_dev(__u16 handle)
  113. {
  114.     return handle >> 8;
  115. }
  116.  
  117. static __inline__ __u16 pn_port(__u16 handle)
  118. {
  119.     return handle & 0x3ff;
  120. }
  121.  
  122. static __inline__ __u8 pn_addr(__u16 handle)
  123. {
  124.     return (handle >> 8) & 0xfc;
  125. }
  126.  
  127. static __inline__ void pn_sockaddr_set_addr(struct sockaddr_pn *spn, __u8 addr)
  128. {
  129.     spn->spn_dev &= 0x03;
  130.     spn->spn_dev |= addr & 0xfc;
  131. }
  132.  
  133. static __inline__ void pn_sockaddr_set_port(struct sockaddr_pn *spn, __u16 port)
  134. {
  135.     spn->spn_dev &= 0xfc;
  136.     spn->spn_dev |= (port >> 8) & 0x03;
  137.     spn->spn_obj = port & 0xff;
  138. }
  139.  
  140. static __inline__ void pn_sockaddr_set_object(struct sockaddr_pn *spn,
  141.                         __u16 handle)
  142. {
  143.     spn->spn_dev = pn_dev(handle);
  144.     spn->spn_obj = pn_obj(handle);
  145. }
  146.  
  147. static __inline__ void pn_sockaddr_set_resource(struct sockaddr_pn *spn,
  148.                         __u8 resource)
  149. {
  150.     spn->spn_resource = resource;
  151. }
  152.  
  153. static __inline__ __u8 pn_sockaddr_get_addr(const struct sockaddr_pn *spn)
  154. {
  155.     return spn->spn_dev & 0xfc;
  156. }
  157.  
  158. static __inline__ __u16 pn_sockaddr_get_port(const struct sockaddr_pn *spn)
  159. {
  160.     return ((spn->spn_dev & 0x03) << 8) | spn->spn_obj;
  161. }
  162.  
  163. static __inline__ __u16 pn_sockaddr_get_object(const struct sockaddr_pn *spn)
  164. {
  165.     return pn_object(spn->spn_dev, spn->spn_obj);
  166. }
  167.  
  168. static __inline__ __u8 pn_sockaddr_get_resource(const struct sockaddr_pn *spn)
  169. {
  170.     return spn->spn_resource;
  171. }
  172.  
  173. #endif
  174.